/* 
 * File:   CollisionDetection.h
 * Author: Piotrek
 *
 * Created on 21 sierpień 2010, 16:49
 */

/**
 * @todo
 * wyrzucanie warningow przez rapid\n
 * optymalizacja pod nasze modele:
 *  - bez przepisywania modeli
 *  - bez wymnazania przez R i T
 */

#ifndef _COLLISIONDETECTION_H
#define	_COLLISIONDETECTION_H

#include "RAPID/RAPID.H"
#include "stdafx.h"
#include <vector>

/**
 * @brief Klasa zawierajaca funkcje do wykrywania kolizji za pomoca biblioteki RAPID.
 * @n Po tej klasie dziedzicza klasy, ktore chca byc wziete pod uwage w trakcie wykrywania kolizji.
 */
class CollisionDetection
{
public:

    /// numer modulu kolidujacego (pierwszego znalezionego)
    int collidedModule;

    /**
     * @brief Inicjalizacja modelu kolizji.
     *
     * Metoda przygotowuje model RAPID na podstawie modulow obiektu,
     * dlatego powinna byc wywolana po dodaniu wszystkich modulow.
     */
    void InitializeCollisionDetectionModel();

    /**
     * @brief Aktualizacja modelu kolizji.
     *
     * Metoda powinna byc wywolana po zmianie polozenia, ktoregos z modulow,
     * lub (dla obiektow nieruchomych) po funkcji InitializeCollisionDetectionModel().\
     */
    void UpdateCollisionDetectionModel(int module);

    /**
     * @brief Statyczna metoda do wykrywania pierwszej kolizji we wszystkich
     * istniejacych obiektach bedacych pod kontrola systemu wykrywania kolizji.
     * @param model zawsze 0
     * @return 1 -wykrycie kolizji, 0 -brak kolizji
     */
    static int FindFirstCollisionInAllObjects(unsigned int model);
    
      
private:

    /// modele kolizji
    std::vector< RAPID_model > rapidModels;
    
    /// wektor wskaznikow do wszystkich obiektow podlegajacyh wykrywaniu kolizji
    static std::vector<CollisionDetection *> models;

    static int FindFirstCollisionBetweenModules(CollisionDetection * model0, CollisionDetection * model1);
    static int CollisionDetectionInModules(RAPID_model * model1, RAPID_model * model2);

};
#endif	/* _COLLISIONDETECTION_H */

